package com.example.travel.service;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;

@Service
public class RedisLockService {

    private final StringRedisTemplate redisTemplate;
    public RedisLockService(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 尝试获取分布式锁
     * @param key 锁的键
     * @param value 锁的值（用于释放锁时的验证）
     * @param expireSeconds 过期时间（秒）
     * @return 是否获取成功
     */
    public boolean tryLock(String key, String value, int expireSeconds) {// 使用Redis的setIfAbsent
        Boolean success = redisTemplate.opsForValue().setIfAbsent(
                key,
                value,
                expireSeconds,
                TimeUnit.SECONDS);
        return Boolean.TRUE.equals(success);// 防止空指针，转换为boolean
    }

    /**
     * 释放分布式锁
     * @param key 锁的键
     * @param value 锁的值（用于验证是否是当前线程加的锁）
     */
    public void unlock(String key, String value) {
        // 获取当前锁的值
        String currentValue = redisTemplate.opsForValue().get(key);

        // 只有当锁存在且值匹配时才释放（防止释放其他线程的锁）
        if (value.equals(currentValue)) {
            redisTemplate.delete(key);
        }
    }
}

